'use strict';

module.exports = core;

const path = require('path');
const semver = require('semver');
const colors = require('colors/safe');
const userHome = require('user-home');
const commander = require('commander');
const pathExists = require('path-exists').sync;

const log = require('@yuyd-cli-dev/log');
const exec = require('@yuyd-cli-dev/exec');

// require .js/.json/.node文件
// .js -> module.exports / exports
// .json -> json.parse
// any -> .js
const pkg = require('../package.json');
const constant = require('./const');

const program = new commander.Command();

async function core() {
  try {
    await prepare();
    registerCommand();
  } catch (e) {
    log.error(e.message);
    if (program.opts().debug) {
      console.log(e);
    }
  }
}

function registerCommand() {
  program
    .name(Object.keys(pkg.bin)[0])
    .usage('<command> [options]')
    .version(pkg.version)
    .option('-d, --debug', '是否开启调试模式', false)
    .option('-tp, --targetPath <targetPath>', '是否本地指定本地调试文件路径', '');
  program.command('init [projectName]').option('-f, --force', '是否强制初始化').action(exec);

  program.command('add [templateName]').option('-n, --force', '是否强添加d代码').action(exec);

  // 开启debug模式
  program.on('option:debug', function () {
    if (program.opts().debug) {
      process.env.LOG_LEVEL = 'verbose';
    } else {
      process.env.LOG_LEVEL = 'info';
    }
    log.level = process.env.LOG_LEVEL;
  });

  // 指定targetPath 设置到环境变量
  program.on('option:targetPath', function () {
    process.env.CLI_TARGET_PATH = program.opts().targetPath;
  });

  // 对未知命令监听
  program.on('command:*', function (operands) {
    const avaliableCommands = program.commands.map((cmd) => cmd.name());
    console.log(colors.red('未知的命令：' + operands[0]));
    if (avaliableCommands.length > 0) {
      console.log(colors.red('可用命令： ' + avaliableCommands.join(',')));
    }
  });

  program.parse(process.argv);

  // 没有参数时，打印帮助文档
  if (program.args && program.args.length < 1) {
    program.outputHelp();
  }
}

async function prepare() {
  checkPkgVersion();
  checkRoot();
  checkUserHome();
  checkEnv();
  await checkGlobalUpdate();
}

async function checkGlobalUpdate() {
  // 1.获取当前版本号和模块名
  const currentVersion = pkg.version;
  const npmName = pkg.name;
  // 2.获取npm API , 获取所有版本号
  const { getNpmSemverVersion } = require('@yuyd-cli-dev/get-npm-info');
  const lastVersion = await getNpmSemverVersion(currentVersion, npmName);
  if (lastVersion && semver.gt(lastVersion, currentVersion)) {
    log.warn(
      '更新提示',
      colors.yellow(`请手动更新 ${npmName}, 当前版本是：${currentVersion}，最新版本：${lastVersion}
            更新命令：npm install -g ${npmName}
        `)
    );
  }
  // 3. 提取所有版本号，比对哪些版本号是大于当前版本号
  // 4. 获取最新的版本号，提示用户更新该版本
}

function checkEnv() {
  const dotenv = require('dotenv');
  const dotenvPath = path.resolve(userHome, '.env');
  if (pathExists(dotenvPath)) {
    dotenv.config({
      path: dotenvPath
    });
  }
  createDefaultConfig();
}

function createDefaultConfig() {
  const cliConfig = {
    home: userHome
  };
  if (process.env.CLI_HOME) {
    cliConfig['cliHome'] = path.join(userHome, process.env.CLI_HOME);
  } else {
    cliConfig['cliHome'] = path.join(userHome, constant.DEFAULT_CLI_HOME);
  }
  process.env.CLI_HOME_PATH = cliConfig.cliHome;
}

// 用户主目录检查
function checkUserHome() {
  if (!userHome || !pathExists(userHome)) {
    throw new Error(colors.red('当前登录涌入主目录不存在！'));
  }
}
// 对root进行降级
function checkRoot() {
  const rooCheck = require('root-check');
  rooCheck();
}
// 检查node版本号
// function checkNodeVersion() {
// 	// 第一步，获取当前Node版本号
// 	const currentVersion = process.version;
// 	// 第二步，比对最低版本号
// 	const lowestVersion = constant.LOWEST_NODE_VERSION;
// 	if (semver.gte(lowestVersion, currentVersion)) {
// 		throw new Error(
// 			colors.red(`yuyd-cli 需要安装 v${lowestVersion} 以上版本的 Node.js`)
// 		);
// 	}
// }
// 检查脚手架版本号
function checkPkgVersion() {
  log.notice('cli', pkg.version);
}
